package br.com.foxinline.modelo;

import br.com.foxinline.enums.AbastecimentoAgua;
import br.com.foxinline.enums.CondicaoPosseMoradia;
import br.com.foxinline.enums.DestinoLixo;
import br.com.foxinline.enums.EscoamentoSanitario;
import br.com.foxinline.enums.LocalizacaoMoradia;
import br.com.foxinline.enums.RevestimentoExterno;
import br.com.foxinline.enums.SituacaoMoradia;
import br.com.foxinline.enums.TipoAcessoDomicilio;
import br.com.foxinline.enums.TipoDomicilio;
import br.com.foxinline.enums.TratamentoAgua;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;

/**
 *
 * @author laverson
 */
@Entity
public class CadastroDomiciliar implements Serializable, Cloneable {

    @Id
    @SequenceGenerator(sequenceName = "seq_cadastro_domiciliar", name = "seq_cadastro_domiciliar", allocationSize = 1)
    @GeneratedValue(generator = "seq_cadastro_domiciliar", strategy = GenerationType.SEQUENCE)
    private Long id;
    @OneToOne
    private Usuario digitadoPor;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataDigitado;
    @OneToOne
    private Usuario conferidoPor;
    private Integer folhaNumero;
    @OneToOne
    private Profissional profissional;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataCadastro;
    @OneToOne(cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.REFRESH}, orphanRemoval = true)
    private Endereco endereco;
    private String telefoneResidencial;
    private String telefoneReferencia;
    @Enumerated(EnumType.STRING)
    private SituacaoMoradia situacaoMoradia;
    @Enumerated(EnumType.STRING)
    private LocalizacaoMoradia localizacaoMoradia;
    @Enumerated(EnumType.STRING)
    private CondicaoPosseMoradia condicaoPosseMoradia;
    private Integer numeroMoradores;
    private Integer numeroComodos;
    @Enumerated(EnumType.STRING)
    private TipoAcessoDomicilio tipoAcessoDomicilio;
    private Boolean disponibilidadeEnergiaEletrica;
    @Enumerated(EnumType.STRING)
    private RevestimentoExterno revestimentoExterno;
    @Enumerated(EnumType.STRING)
    private AbastecimentoAgua abastecimentoAgua;
    @Enumerated(EnumType.STRING)
    private EscoamentoSanitario escoamentoSanitario;
    @Enumerated(EnumType.STRING)
    private TratamentoAgua tratamentoAgua;
    @Enumerated(EnumType.STRING)
    private DestinoLixo destinoLixo;
    @Enumerated(EnumType.STRING)
    private TipoDomicilio tipoDomicilio;
    private Boolean possuiAnimalDomicilio;
    @OneToMany
    private List<AnimalDomicilio> animalDomicilio;
    private Integer quantidadeAnimalDomicilio;
    @OneToMany(cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.REFRESH}, orphanRemoval = true)
    private List<CadastroDomiciliarFamilias> cadastroDomiciliarFamilias;
    @OneToOne
    private CadastroDomiciliar cadastroHistorico;
    private Boolean ativo = true;
    private Boolean atual = true;
    @Version
    private int versao;

    public CadastroDomiciliar() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Usuario getDigitadoPor() {
        return digitadoPor;
    }

    public void setDigitadoPor(Usuario digitadoPor) {
        this.digitadoPor = digitadoPor;
    }

    public Date getDataDigitado() {
        return dataDigitado;
    }

    public void setDataDigitado(Date dataDigitado) {
        this.dataDigitado = dataDigitado;
    }

    public Usuario getConferidoPor() {
        return conferidoPor;
    }

    public void setConferidoPor(Usuario conferidoPor) {
        this.conferidoPor = conferidoPor;
    }

    public Integer getFolhaNumero() {
        return folhaNumero;
    }

    public void setFolhaNumero(Integer folhaNumero) {
        this.folhaNumero = folhaNumero;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public String getTelefoneResidencial() {
        return telefoneResidencial;
    }

    public void setTelefoneResidencial(String telefoneResidencial) {
        this.telefoneResidencial = telefoneResidencial;
    }

    public String getTelefoneReferencia() {
        return telefoneReferencia;
    }

    public void setTelefoneReferencia(String telefoneReferencia) {
        this.telefoneReferencia = telefoneReferencia;
    }

    public SituacaoMoradia getSituacaoMoradia() {
        return situacaoMoradia;
    }

    public void setSituacaoMoradia(SituacaoMoradia situacaoMoradia) {
        this.situacaoMoradia = situacaoMoradia;
    }

    public LocalizacaoMoradia getLocalizacaoMoradia() {
        return localizacaoMoradia;
    }

    public void setLocalizacaoMoradia(LocalizacaoMoradia localizacaoMoradia) {
        this.localizacaoMoradia = localizacaoMoradia;
    }

    public CondicaoPosseMoradia getCondicaoPosseMoradia() {
        return condicaoPosseMoradia;
    }

    public void setCondicaoPosseMoradia(CondicaoPosseMoradia condicaoPosseMoradia) {
        this.condicaoPosseMoradia = condicaoPosseMoradia;
    }

    public Integer getNumeroMoradores() {
        return numeroMoradores;
    }

    public void setNumeroMoradores(Integer numeroMoradores) {
        this.numeroMoradores = numeroMoradores;
    }

    public Integer getNumeroComodos() {
        return numeroComodos;
    }

    public void setNumeroComodos(Integer numeroComodos) {
        this.numeroComodos = numeroComodos;
    }

    public TipoAcessoDomicilio getTipoAcessoDomicilio() {
        return tipoAcessoDomicilio;
    }

    public void setTipoAcessoDomicilio(TipoAcessoDomicilio tipoAcessoDomicilio) {
        this.tipoAcessoDomicilio = tipoAcessoDomicilio;
    }

    public Boolean getDisponibilidadeEnergiaEletrica() {
        return disponibilidadeEnergiaEletrica;
    }

    public void setDisponibilidadeEnergiaEletrica(Boolean disponibilidadeEnergiaEletrica) {
        this.disponibilidadeEnergiaEletrica = disponibilidadeEnergiaEletrica;
    }

    public RevestimentoExterno getRevestimentoExterno() {
        return revestimentoExterno;
    }

    public void setRevestimentoExterno(RevestimentoExterno revestimentoExterno) {
        this.revestimentoExterno = revestimentoExterno;
    }

    public AbastecimentoAgua getAbastecimentoAgua() {
        return abastecimentoAgua;
    }

    public void setAbastecimentoAgua(AbastecimentoAgua abastecimentoAgua) {
        this.abastecimentoAgua = abastecimentoAgua;
    }

    public EscoamentoSanitario getEscoamentoSanitario() {
        return escoamentoSanitario;
    }

    public void setEscoamentoSanitario(EscoamentoSanitario escoamentoSanitario) {
        this.escoamentoSanitario = escoamentoSanitario;
    }

    public TratamentoAgua getTratamentoAgua() {
        return tratamentoAgua;
    }

    public void setTratamentoAgua(TratamentoAgua tratamentoAgua) {
        this.tratamentoAgua = tratamentoAgua;
    }

    public DestinoLixo getDestinoLixo() {
        return destinoLixo;
    }

    public void setDestinoLixo(DestinoLixo destinoLixo) {
        this.destinoLixo = destinoLixo;
    }

    public TipoDomicilio getTipoDomicilio() {
        return tipoDomicilio;
    }

    public void setTipoDomicilio(TipoDomicilio tipoDomicilio) {
        this.tipoDomicilio = tipoDomicilio;
    }

    public Boolean getPossuiAnimalDomicilio() {
        return possuiAnimalDomicilio;
    }

    public void setPossuiAnimalDomicilio(Boolean possuiAnimalDomicilio) {
        this.possuiAnimalDomicilio = possuiAnimalDomicilio;
    }

    public List<AnimalDomicilio> getAnimalDomicilio() {
        return animalDomicilio;
    }

    public void setAnimalDomicilio(List<AnimalDomicilio> animalDomicilio) {
        this.animalDomicilio = animalDomicilio;
    }

    public Integer getQuantidadeAnimalDomicilio() {
        return quantidadeAnimalDomicilio;
    }

    public void setQuantidadeAnimalDomicilio(Integer quantidadeAnimalDomicilio) {
        this.quantidadeAnimalDomicilio = quantidadeAnimalDomicilio;
    }

    public List<CadastroDomiciliarFamilias> getCadastroDomiciliarFamilias() {
        return cadastroDomiciliarFamilias;
    }

    public void setCadastroDomiciliarFamilias(List<CadastroDomiciliarFamilias> cadastroDomiciliarFamilias) {
        this.cadastroDomiciliarFamilias = cadastroDomiciliarFamilias;
    }

    public Profissional getProfissional() {
        return profissional;
    }

    public void setProfissional(Profissional profissional) {
        this.profissional = profissional;
    }

    public Boolean getAtivo() {
        return ativo;
    }

    public void setAtivo(Boolean ativo) {
        this.ativo = ativo;
    }

    public int getVersao() {
        return versao;
    }

    public void setVersao(int versao) {
        this.versao = versao;
    }

    public CadastroDomiciliar getCadastroHistorico() {
        return cadastroHistorico;
    }

    public void setCadastroHistorico(CadastroDomiciliar cadastroHistorico) {
        this.cadastroHistorico = cadastroHistorico;
    }

    public Boolean getAtual() {
        return atual;
    }

    public void setAtual(Boolean atual) {
        this.atual = atual;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 41 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 41 * hash + (this.digitadoPor != null ? this.digitadoPor.hashCode() : 0);
        hash = 41 * hash + (this.dataDigitado != null ? this.dataDigitado.hashCode() : 0);
        hash = 41 * hash + (this.conferidoPor != null ? this.conferidoPor.hashCode() : 0);
        hash = 41 * hash + (this.folhaNumero != null ? this.folhaNumero.hashCode() : 0);
        hash = 41 * hash + (this.profissional != null ? this.profissional.hashCode() : 0);
        hash = 41 * hash + (this.dataCadastro != null ? this.dataCadastro.hashCode() : 0);
        hash = 41 * hash + (this.endereco != null ? this.endereco.hashCode() : 0);
        hash = 41 * hash + (this.telefoneResidencial != null ? this.telefoneResidencial.hashCode() : 0);
        hash = 41 * hash + (this.telefoneReferencia != null ? this.telefoneReferencia.hashCode() : 0);
        hash = 41 * hash + (this.situacaoMoradia != null ? this.situacaoMoradia.hashCode() : 0);
        hash = 41 * hash + (this.localizacaoMoradia != null ? this.localizacaoMoradia.hashCode() : 0);
        hash = 41 * hash + (this.condicaoPosseMoradia != null ? this.condicaoPosseMoradia.hashCode() : 0);
        hash = 41 * hash + (this.numeroMoradores != null ? this.numeroMoradores.hashCode() : 0);
        hash = 41 * hash + (this.numeroComodos != null ? this.numeroComodos.hashCode() : 0);
        hash = 41 * hash + (this.tipoAcessoDomicilio != null ? this.tipoAcessoDomicilio.hashCode() : 0);
        hash = 41 * hash + (this.disponibilidadeEnergiaEletrica != null ? this.disponibilidadeEnergiaEletrica.hashCode() : 0);
        hash = 41 * hash + (this.revestimentoExterno != null ? this.revestimentoExterno.hashCode() : 0);
        hash = 41 * hash + (this.abastecimentoAgua != null ? this.abastecimentoAgua.hashCode() : 0);
        hash = 41 * hash + (this.escoamentoSanitario != null ? this.escoamentoSanitario.hashCode() : 0);
        hash = 41 * hash + (this.tratamentoAgua != null ? this.tratamentoAgua.hashCode() : 0);
        hash = 41 * hash + (this.destinoLixo != null ? this.destinoLixo.hashCode() : 0);
        hash = 41 * hash + (this.tipoDomicilio != null ? this.tipoDomicilio.hashCode() : 0);
        hash = 41 * hash + (this.possuiAnimalDomicilio != null ? this.possuiAnimalDomicilio.hashCode() : 0);
        hash = 41 * hash + (this.animalDomicilio != null ? this.animalDomicilio.hashCode() : 0);
        hash = 41 * hash + (this.quantidadeAnimalDomicilio != null ? this.quantidadeAnimalDomicilio.hashCode() : 0);
        hash = 41 * hash + (this.cadastroDomiciliarFamilias != null ? this.cadastroDomiciliarFamilias.hashCode() : 0);
        hash = 41 * hash + (this.cadastroHistorico != null ? this.cadastroHistorico.hashCode() : 0);
        hash = 41 * hash + (this.ativo != null ? this.ativo.hashCode() : 0);
        hash = 41 * hash + (this.atual != null ? this.atual.hashCode() : 0);
        hash = 41 * hash + this.versao;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final CadastroDomiciliar other = (CadastroDomiciliar) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if (this.digitadoPor != other.digitadoPor && (this.digitadoPor == null || !this.digitadoPor.equals(other.digitadoPor))) {
            return false;
        }
        if (this.dataDigitado != other.dataDigitado && (this.dataDigitado == null || !this.dataDigitado.equals(other.dataDigitado))) {
            return false;
        }
        if (this.conferidoPor != other.conferidoPor && (this.conferidoPor == null || !this.conferidoPor.equals(other.conferidoPor))) {
            return false;
        }
        if (this.folhaNumero != other.folhaNumero && (this.folhaNumero == null || !this.folhaNumero.equals(other.folhaNumero))) {
            return false;
        }
        if (this.profissional != other.profissional && (this.profissional == null || !this.profissional.equals(other.profissional))) {
            return false;
        }
        if (this.dataCadastro != other.dataCadastro && (this.dataCadastro == null || !this.dataCadastro.equals(other.dataCadastro))) {
            return false;
        }
        if (this.endereco != other.endereco && (this.endereco == null || !this.endereco.equals(other.endereco))) {
            return false;
        }
        if ((this.telefoneResidencial == null) ? (other.telefoneResidencial != null) : !this.telefoneResidencial.equals(other.telefoneResidencial)) {
            return false;
        }
        if ((this.telefoneReferencia == null) ? (other.telefoneReferencia != null) : !this.telefoneReferencia.equals(other.telefoneReferencia)) {
            return false;
        }
        if (this.situacaoMoradia != other.situacaoMoradia) {
            return false;
        }
        if (this.localizacaoMoradia != other.localizacaoMoradia) {
            return false;
        }
        if (this.condicaoPosseMoradia != other.condicaoPosseMoradia) {
            return false;
        }
        if (this.numeroMoradores != other.numeroMoradores && (this.numeroMoradores == null || !this.numeroMoradores.equals(other.numeroMoradores))) {
            return false;
        }
        if (this.numeroComodos != other.numeroComodos && (this.numeroComodos == null || !this.numeroComodos.equals(other.numeroComodos))) {
            return false;
        }
        if (this.tipoAcessoDomicilio != other.tipoAcessoDomicilio) {
            return false;
        }
        if (this.disponibilidadeEnergiaEletrica != other.disponibilidadeEnergiaEletrica && (this.disponibilidadeEnergiaEletrica == null || !this.disponibilidadeEnergiaEletrica.equals(other.disponibilidadeEnergiaEletrica))) {
            return false;
        }
        if (this.revestimentoExterno != other.revestimentoExterno) {
            return false;
        }
        if (this.abastecimentoAgua != other.abastecimentoAgua) {
            return false;
        }
        if (this.escoamentoSanitario != other.escoamentoSanitario) {
            return false;
        }
        if (this.tratamentoAgua != other.tratamentoAgua) {
            return false;
        }
        if (this.destinoLixo != other.destinoLixo) {
            return false;
        }
        if (this.tipoDomicilio != other.tipoDomicilio) {
            return false;
        }
        if (this.possuiAnimalDomicilio != other.possuiAnimalDomicilio && (this.possuiAnimalDomicilio == null || !this.possuiAnimalDomicilio.equals(other.possuiAnimalDomicilio))) {
            return false;
        }
        if (this.animalDomicilio != other.animalDomicilio && (this.animalDomicilio == null || !this.animalDomicilio.equals(other.animalDomicilio))) {
            return false;
        }
        if (this.quantidadeAnimalDomicilio != other.quantidadeAnimalDomicilio && (this.quantidadeAnimalDomicilio == null || !this.quantidadeAnimalDomicilio.equals(other.quantidadeAnimalDomicilio))) {
            return false;
        }
        if (this.cadastroDomiciliarFamilias != other.cadastroDomiciliarFamilias && (this.cadastroDomiciliarFamilias == null || !this.cadastroDomiciliarFamilias.equals(other.cadastroDomiciliarFamilias))) {
            return false;
        }
        if (this.cadastroHistorico != other.cadastroHistorico && (this.cadastroHistorico == null || !this.cadastroHistorico.equals(other.cadastroHistorico))) {
            return false;
        }
        if (this.ativo != other.ativo && (this.ativo == null || !this.ativo.equals(other.ativo))) {
            return false;
        }
        if (this.atual != other.atual && (this.atual == null || !this.atual.equals(other.atual))) {
            return false;
        }
        if (this.versao != other.versao) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "CadastroDomiciliar{" + "id=" + id + ", digitadoPor=" + digitadoPor + ", dataDigitado=" + dataDigitado + ", conferidoPor=" + conferidoPor + ", folhaNumero=" + folhaNumero + ", profissional=" + profissional + ", dataCadastro=" + dataCadastro + ", endereco=" + endereco + ", telefoneResidencial=" + telefoneResidencial + ", telefoneReferencia=" + telefoneReferencia + ", situacaoMoradia=" + situacaoMoradia + ", localizacaoMoradia=" + localizacaoMoradia + ", condicaoPosseMoradia=" + condicaoPosseMoradia + ", numeroMoradores=" + numeroMoradores + ", numeroComodos=" + numeroComodos + ", tipoAcessoDomicilio=" + tipoAcessoDomicilio + ", disponibilidadeEnergiaEletrica=" + disponibilidadeEnergiaEletrica + ", revestimentoExterno=" + revestimentoExterno + ", abastecimentoAgua=" + abastecimentoAgua + ", escoamentoSanitario=" + escoamentoSanitario + ", tratamentoAgua=" + tratamentoAgua + ", destinoLixo=" + destinoLixo + ", tipoDomicilio=" + tipoDomicilio + ", possuiAnimalDomicilio=" + possuiAnimalDomicilio + ", animalDomicilio=" + animalDomicilio + ", quantidadeAnimalDomicilio=" + quantidadeAnimalDomicilio + ", cadastroDomiciliarFamilias=" + cadastroDomiciliarFamilias + ", cadastroHistorico=" + cadastroHistorico + ", ativo=" + ativo + ", atual=" + atual + ", versao=" + versao + '}';
    }

    public CadastroDomiciliar getClone() {
        try {
            return (CadastroDomiciliar) super.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println(" Cloning not allowed. ");
            return this;
        }
    }
}
